#ifndef _MEMORY_BOARD_H_
#define _MEMORY_BOARD_H_

#include "config.h"

// 启动启动写保护的电压百分比
#define WRITE_PROTECT_VOLTAGE_PERCENTAGE                   5

// 更新系统参数
typedef void (*UpdateDeviceParmaeterTask_t)(void);


/**
 * @brief 事件类型
 *
 */
typedef enum
{
  UPDATE_DEVICE_PARAM = 1 << 0, // 更新设备参数
} MemoryTypeOfEvent_t;

/**
 * @brief 外调调用方法
 *
 */
typedef struct
{
  UpdateDeviceParmaeterTask_t UpdateDeviceParmaeterTask;
} MemoryExternalInterfaces_t;

/**
 * @brief 获取实时时间戳
 *
 * @return uint32_t - 时间戳
 */
extern uint32_t MemoryGetTimestamp(void);

/**
 * @brief 获取实时时间
 *
 * @param pYr - 年
 * @param pMt - 月
 * @param pDe - 日
 * @param pHr - 时
 * @param pMe - 分
 * @param pSd - 秒
 * @param pWk - 周
 */
extern void MemoryGetTheCurrentTime(uint16_t *pYr, uint8_t *pMt, uint8_t *pDe, uint8_t *pHr, uint8_t *pMe, uint8_t *pSd, uint8_t *pWk);

/**
 * @brief 删除外部模组所有用户
 *
 */
extern void MemoryDeleteAllUserFromExternalModule(void);

/**
 * @brief 删除外部模组中的特定用户
 *
 * @param pKeyValueIn - 用户密钥
 */
extern void MemoryDeleteSpecificUserFromExternalModule(const uint8_t *pKeyValueIn);

/**
 * @brief 标志事件更新
 * 
 */
extern void MemoryMarkLogToBeUpload(void);

/**
 * @brief 停止更新设备参数任务
 *
 */
extern void MemoryStopUpdateParameterTask(void);

/**
 * @brief 延时启动更新设备参数任务
 *
 * @param DelayMs
 */
extern void MemoryDelayedStartUpdateParameterTask(uint32_t DelayMs);

/**
 * @brief 立刻启动更新设备参数任务
 *
 */
extern void MemoryStartUpdateParameterTaskNoWait(void);

/**
 * @brief 板载功能初始化
 *
 * @param pExternalInterfaces - 外部调用方法
 */
extern void MemoryBoardInitialisation(MemoryExternalInterfaces_t *pExternalInterfaces);

#endif
